天池离线赛 - 移动推荐算法(一):题目与数据

移动推荐算法是阿里天池赛2015年赛题之一,题目以移动电商平台的真实用户-商品行为数据为基础来构建商品推荐模型。该题现已成为新人入门的经典演练对象,博主也希望基于该题场景,加深对机器学习相关知识的理解,积累实践经验。

题目回顾

关于题目和数据的介绍可访问天池官网中的:离线赛(移动推荐算法)-赛题与数据

业务场景

在真实的业务场景下,我们往往需要对所有商品的一个子集构建个性化推荐模型。在完成这件任务的过程中,我们不仅需要利用用户在这个商品子集上的行为数据,往往还需要利用更丰富的用户行为数据。定义如下的符号:

U——用户集合

I——商品全集

P——商品子集,P ⊆ I

D——用户对商品全集的行为数据集合

那么我们的目标是利用 D 来构造 U 中用户对 P 中商品的推荐模型。

数据内容

本场比赛提供20000用户的完整行为数据以及百万级的商品信息。竞赛数据包含两个部分。第一部分是用户在商品全集上的移动端行为数据(D),表名为tianchi_fresh_comp_train_user,第二个部分是商品子集(P),表名为tianchi_fresh_comp_train_item,两个数据集所包含的字段如下:

D: tianchi_fresh_comp_train_user:

字段 字段说明 提取说明
user_id 用户标识 抽样&字段脱敏
item_id 商品标识 字段脱敏
behavior_type 用户对商品的行为类型 包括浏览、收藏、加购物车、购买,对应取值分别是1、2、3、4
user_geohash 用户位置的空间标识,可以为空 由经纬度通过保密的算法生成
item_category 商品分类标识 字段脱敏
time 行为时间 精确到小时级别

P: tianchi_fresh_comp_train_item:

字段 字段说明 提取说明
item_id 商品标识 抽样&字段脱敏
item_ geohash 商品位置的空间标识,可以为空 由经纬度通过保密的算法生成
item_category 商品分类标识 字段脱敏

训练数据包含了抽样出来的一定量用户在一个月时间(11.18~12.18)之内的移动端行为数据(D)。

评分数据是这些用户在这个一个月之后的一天(12.19)对商品子集(P)的购买数据。

赛题目标

参赛者要使用训练数据建立推荐模型,并输出用户在接下来一天对商品子集购买行为的预测结果。即预测12.19这一天用户在P上的购买情况

参赛者完成用户对商品子集的购买预测之后,需要将结果放入指定格式的数据表(非分区表)中,要求结果表名为:tianchi_mobile_recommendation_predict.csv,且以utf-8格式编码;包含user_iditem_id两列(均为string类型),要求去除重复。例如:

结果评价

比赛采用经典的精确度(precision)、召回率(recall)和F1值作为评估指标。具体计算公式如下:

其中PredictionSet为算法预测的购买数据集合,ReferenceSet为真实的答案购买数据集合。我们以F1值作为最终的唯一评测标准。

问题综述

采用前面一个月的用户-行为数据,预测在接下来的一天用户在指定商品子集上的购买情况

数据解析

在得到数据后对数据进行初步分析认识是很有趣的。这里我们结合一些数据预处理和可视化的手段,对数据内涵进行初步挖掘。

规模和属性

数据规模

数据集文件fresh_comp_offline包含两个csv文件,分别对应数据集D和P。其文件大小如下图示:

根据题目,我们将上述两个数据集分别即为 D 和 P

采用vim查看数据集文件内容,示意如下:

从上面的分析可以看到:D数据集包含2千多万条样本,文件大小约1G;P数据集包含60多万条记录,文件大小约10M。可以进一步测试数据全部加载所需时间,从而对数据量有个更直观的感受(这里采用python-pandas,查看测试代码)。结果显示,在我的计算机环境下,D数据集载入pandas-dataframe耗时约45s,P数据集载入耗时不到1s。(可以看到数据集的规模比较大,基于普通PC环境的分析处理可能会承受一定的压力,可考虑分块操作或抽样分析。)

属性特征

数据的属性已经在题目中给出,可以采用pandas查看部分数据如下图示:

  1. 数据集D

       user_id   item_id    behavior_type  user_geohash  item_category  time  
    0  10001082  285259775  1              97lk14c       4076           2014-12-08 18  
    1  10001082    4368907  1              NaN           5503           2014-12-12 12  
    2  10001082    4368907  1              NaN           5503           2014-12-12 12  
    3  10001082   53616768  1              NaN           9762           2014-12-02 15  
    4  10001082  151466952  1              NaN           5232           2014-12-12 11  
    
  2. 数据集P

       item_id    item_geohash  item_category
    0  100002303  NaN           3368
    1  100003592  NaN           7995
    2  100006838  NaN           12630
    3  100008089  NaN           7791
    4  100012750  NaN           9614    
    

其中数据集D包含6个属性,如代表不同用户的user_id,代表不同商品的item_id等;数据集P包含3个属性。下面列出一些基本的观点:

  • 每一条样本对应于用户-行为记录,即user_id - behaviour_type,同时给出了对象item_id和其他关联属性。
  • 每个属性取值均可在不同的样本中出现。

宏观分析

点击购买转化率

我们的目标是预测购买事件的发生,在这样的业务背景下,我们先关注一下CTR指数(操作购买转化率),即用户购买商品与需要操作的次数的平均比率。通过pandas统计value_counts()统计behavior_type数据列可得:

CTR = 购买操作样本数 / 样本总数 = 232579 / 23291027 = 0.009986 ≈ 1%

即用户平均下来大约要进行100次操作(各种商品的点击查看、加购物车等行为),才会生成一次购买决定。

宏观行为统计

这里要按时间对数据进行一些可视化呈现,暂不考虑由“地理位置-时区”等因素,默认为统一的时间尺度。注意原始数据中的时间格式为%Y-%m-%d %H,精确到小时,(python有许多成熟的软件包可完成对时间数据的高效处理)。这里主要基于pandas-matplotlib进行可视化分析。一些图像如下:(查看可视化代码

11月18-12月18,每日操作次数如图:

其中属于商品子集P的操作次数如图:

可以看到,除了“双12时期”记录猛增之外,总体稳定(没有反映“月光族”现象),进一步我们发现,不仅总操作数规模平稳,每类操作数也是平稳的。

下面考察两个假定的“平凡日”12月17日-18日,其各种操作(behavior_type)基于小时记录的统计如下图示:

可见两天的变化趋势基本一致,并且可以看出一些符合实际的规律,比如每天记录的高峰期在晚上(人们较空闲),比如凌晨记录相对较少(都睡觉了),比如0号操作(点击浏览behavior_type=1)比其他三种多得多等等。我们进一步查看3号
操作(购买behavior_type=1)的统计如下图示:

可看到每天购买操作的变化趋势大体相同,同其他类型操作一致。

微观行为统计

首先考察用户微观信息,这里我们抽取一些用户,查看其操作(behavior_type)的统计信息得到下表。

从表中可以看出这几个用户的信息,如10001082的的CTR(操作购买转化率)高,且没有收藏和加购物车的习惯,看来很果断;如108461135的操作次数多,可能成天逛手淘;111345634购买次数很多,可能是购物狂等等。

然后考察商品微观信息,先查看数据集P,(由于P文件较小,可直接采用excel进行分析)。一些统计信息如下表示:

得出数据集P总计62万多件商品,分属于1054个商品类,其中最多的商品类4561包括3万多件商品,最少的类别只有一件商品。

进一步地,我们还可以分析同一类商品的销售量,同一个用户的商品购买分布及对应的回头率等等更多内容。。。

本文小结

本文先是对“移动推荐算法”的题目进行了回顾,然后基于大量可视化的呈现对数据集进行了初步分析。至此,我们对所要分析的数据对象有了一个基本的轮廓认知,为进一步的数据挖掘工作做出了先验铺垫。